package com.auntvt.timo.jpax.core.quick.chain;

import com.auntvt.timo.jpax.core.interfaces.JpaxFunction;
import com.auntvt.timo.jpax.core.quick.interfaces.IChainQuick;
import com.auntvt.timo.jpax.core.service.ChainQuickService;
import com.auntvt.timo.jpax.core.utils.LambdaUtil;
import org.springframework.dao.InvalidDataAccessApiUsageException;

/**
 * 可通过ChainQuickService链式调用Quick查询功能
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public class LambdaChainQuick<T> extends AbstractJpaChainQuick<T, LambdaChainQuick<T>, JpaxFunction<T, ?>> implements IChainQuick<T> {

    /**
     * Quick对象
     */
    private ChainQuickService<T> service;

    /**
     * 可通过ChainQuickService链式调用Quick查询功能
     *
     * @param service ChainQuickService对象
     */
    public LambdaChainQuick(ChainQuickService<T> service) {
        this.service = service;
    }

    /**
     * Quick对象
     *
     * @return AbstractQuick 类型
     */
    @Override
    protected ChainQuickService<T> getService() {
        return service;
    }

    /**
     * 子类创建一个本身的实例对象
     */
    @Override
    protected LambdaChainQuick<T> instance() {
        return new LambdaChainQuick<T>(service);
    }

    /**
     * 将字段名称对象格式化为字符串类型，由子类负责实现
     *
     * @param fieldName 字段名称对象
     * @return 字段名
     */
    @Override
    protected String fieldNameToString(JpaxFunction<T, ?> fieldName) {
        String name = LambdaUtil.getFieldName(fieldName);
        if (name == null || name.trim().length() == 0) {
            throw new InvalidDataAccessApiUsageException("字段系列化失败，无法获得字段名称！");
        }
        return name;
    }
}
